package com.atguigu.gmall;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author 李旭
 * @date 2021/11/20 16:17
 * @Description:
 *
 *   异步编排    线程间通信
 *
 *   多线程  JUC课程上
 *
 *
 */
public class CompletableFutureDemo3 {


    public static void main(String[] args) throws Exception{
        //自定义线程池
        ThreadPoolExecutor threadPoolExecutor = new
                ThreadPoolExecutor(
                    5,//核心线程
                    10,//最大线程数
                    3,
                 TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10)
        );

        //1、开启一个新的线程
        CompletableFuture<String> oneCompletableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println("第一个任务：" + Thread.currentThread().getName());
            return "我是第一个任务";
        }, threadPoolExecutor);

        //2、又开启一个新的线程
        CompletableFuture<String> twoCompletableFuture = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("第二个任务：" + Thread.currentThread().getName());
            return "我是第二个任务";
        }, threadPoolExecutor);
        // JUC 倒计数器
        // 案例： 6名同学离开教室之后 值班同学再关门   分析： 6名同学是6个子线程  值班同学是主线程

        //多任务组合  ： 主线程要依赖多个子线程   用join主线程就阻塞了吧
        CompletableFuture.allOf(oneCompletableFuture,twoCompletableFuture).join();
        //CompletableFuture.anyOf(oneCompletableFuture,twoCompletableFuture).join();

        //一个线程 join 表示：将这个线程暂停


        System.out.println("我是主线程:" + Thread.currentThread().getName());


        //第一个任务：pool-1-thread-1
        //第二个任务：pool-1-thread-2
        //我是主线程:main
    }
}
